/* 
 * BSP.h - The C head file of the whole system BoardSupportPackage
 * NOTE: This file is based on HAL library of stm32 platform
 *
 * Copyright (c) 2020-, garbage classify Project
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author            Notes           mail
 * 2021-03-04     江榕煜       first version   2373180028@qq.com
**/

#ifndef _BSP_H_
#define _BSP_H_

#include "main.h"
//#include "adc.h"
#include "i2c.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"
//#include "spi.h"
#include "dma.h"

#include <stdio.h>
#include <stdlib.h>

#include <stdint.h>
#include <rthw.h>
#include <rtthread.h>


#include "IMU_WT931.h"


#define IMU_UART_HANDLER huart3


/***********BSP用户类型声明************/

/*  @brief  电磁弹射系统状态枚举类型
 *  @note   
 *  @author 江榕煜（2021.6.15）
**/
typedef enum {
    standby = 0,    // 待命
    charge  = 1,    // 充电
    EMIT    = 2     // 发射！
} magneticEmitStatus;


/***********BSP用户接口声明************/

/** @brief  IMU数据单次采样
 *  @note   函数内部有等待接收数据的信号量
 *  @author 江榕煜（2021.3.19）
 *  @param  None
 *  @retval None
**/
void IMU_Sampling(void);

/** @brief  直流电机速度设置
 *  @note   使用前必使用 DCMotor_Init() 方法
 *          通道号从0开始
 *          速度百分比范围：-100%~+100%
 *  @author 江榕煜（2021.4.2）
 *  @param
 *          channel(uint32_t)   电机通道号
 *          duty(float)         占空比
 *  @retval 
 *          None
**/
void DCMotor_SetSpeed(uint32_t channel,float duty);

/** @brief  关闭直流电机PWM设备
 *  @note   要恢复需调用 DCMotor_Init() 方法
 *  @author 江榕煜（2021.4.2）
 *  @param
 *          None
 *  @retval 
 *          None
**/
void DCMotor_Unload(void);

/** @brief  计算计数器差
 *  @note
 *  @author 江榕煜（2021.5.27）
 *  @param  
 *      channel(uint32_t)       通道号，从0开始
 *  @retval
 *      deltaSpeed(int32_t)    计数器差值，定采样可代表速度
**/
int32_t ABcoder_getSpeed(uint32_t channel);

/** @brief  舵机位置设置
 *  @note   使用前必使用 steerEngine_Init() 方法
 *          位置百分比范围：-100%~+100%
 *  @author 江榕煜（2021.4.2）
 *  @param
 *          channel(uint32_t)   电机通道号
 *          duty(float)         占空比
 *  @retval 
 *          None
**/
void steerEngine_SetPos(uint32_t channel,float duty);

/** @brief  电磁炮控制！
 *  @note   
 *  @author 江榕煜（2021.6.15）
 *  @param  
 *      statusCmd(magneticEmitStatus)   状态命令
 *  @retval
**/
void magneticEmitCtrl(magneticEmitStatus statusCmd);

/** @brief  激光控制
 *  @note   
 *  @author 江榕煜（2021.6.15）
 *  @param  亮度百分比
 *  @retval None
**/
void laserCtrl(float duty);
    
/***********BSP系统初始化接口声明************/

/** @brief  IMU初始化
 *  @note   调用前先初始化串口
 *  @author 江榕煜（2021.3.19）
 *  @param  None
 *  @retval 
 *      WT931_9AxisData*    IMU数据对象（可直接读取）
**/
WT931_9AxisData * IMU_Init(void);

/** @brief  直流电机初始化
 *  @note   调用前先初始化PWM设备
 *  @author 江榕煜（2021.4.2）
 *  @param  
 *          None
 *  @retval 
 *          None
**/
void DCMotor_Init(void);


/** @brief  正交编码器初始化
 *  @note   调用前先初始化定时器设备
 *  @author 江榕煜（2021.4.9）
 *  @param  
 *          None
 *  @retval 
 *          None
**/
void ABcoder_Init(void);

/** @brief  舵机初始化
 *  @note   
 *  @author 江榕煜（2021.6.8）
 *  @param  None
 *  @retval None
**/
void steerEngine_Init(void);

/** @brief  初始化电磁炮相关外设
 *  @note   包括GPO和激光亮度PWM
 *  @author 江榕煜（2021.6.15）
 *  @param  None
 *  @retval None
**/
void magneticEmit_Init(void);

/** @brief  攻击控制服务初始化
 *  @note   
 *  @author 江榕煜（2021.6.16）
 *  @param  None
 *  @retval
 *          sem_Attack_t(rt_sem_t)  信号量对象
**/
rt_mailbox_t thread_Attack_Init(void);

/* --- 回调函数 --- */
/** @brief  上位机接收回调函数
 *  @note   收到一个完整帧，目前没有做自动字节序对齐
 *  @author 江榕煜（2021.6.15）
 *  @param  huart(UART_HandleTypeDef *) 串口对象
 *  @retval None
**/
void UART4IMU_RxCpltCallback(UART_HandleTypeDef *huart);

/** @brief  上位机接收回调函数
 *  @note   收到一个完整帧，目前没有做自动字节序对齐
 *  @author 江榕煜（2021.6.15）
 *  @param  None
 *  @retval None
**/
void HostRecv_RxCpltCallback(UART_HandleTypeDef *huart);

#endif
